package org.excilys.training.ebanking.dao;

import java.util.ArrayList;
import java.util.List;
import org.excilys.training.ebanking.idao.IDaoCompte;
import org.excilys.training.ebanking.model.Compte;
import org.hibernate.SessionFactory;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

@Repository(value="daoCompte")
public class DaoCompte extends HibernateDaoSupport implements IDaoCompte {

	private static final Logger LOGGER = LoggerFactory.getLogger(DaoCompte.class);
	
	@Autowired
	public DaoCompte(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	/**
	 * Méthode recupérant la liste de comptes d'un client
	 * <p>
	 * 
	 * @param id
	 *            identifiant d'un client
	 * 
	 * @return liste des comptes d'un client
	 */
	
	@SuppressWarnings("unchecked")
	public List<Compte> getAllAccountByClientId(int id) {
		String query = "FROM Compte c INNER JOIN FETCH c.clients u WHERE u.id=?";		

		return getHibernateTemplate().find(query, id);
	}

	/**
	 * Méthode permettant au cliant de sélectionner un compte donné
	 * <p>
	 * 
	 * @param id
	 *            numéro d'un compte
	 * 
	 * @return compte
	 * 
	 */
	public Compte getAccount(int id) {
		LOGGER.debug("Compte n°'{}'", id);
		
		return getHibernateTemplate().get(Compte.class, id);
	}

	/**
	 * Méthode permettant d'obtenir l'encour d'un compte
	 * <p>
	 * 
	 * @param id
	 *            numero de compte
	 * 
	 * @return encours
	 */
	@SuppressWarnings("unchecked")
	public double getEncours(int id) {

		String query = "Select c.encour From Compte c Where c.id=?";
		List<Double> encours = new ArrayList<Double>();
		encours = getHibernateTemplate().find(query, id);

		return encours.get(0);
	}

	@SuppressWarnings("unchecked")
	public double calculenCoursduMois(int id) {

		int annecourant = new DateTime().getYear();
		int mois = new DateTime().getMonthOfYear();
		DateTime dateLimit = new DateTime(annecourant, mois, 1, 0, 0, 0, 0);
		List<Double> encours = new ArrayList<Double>();
		String query = " Select sum(o.montant) from Operation o INNER JOIN  o.compte  "
				+ "where o.compte.id=? and o.dateOperation>?"
				+ " Group by o.typeOperation" + " HAVING o.typeOperation.id=3";

		encours = getHibernateTemplate().find(query, id, dateLimit);			
		return encours.get(0);			
	}

	/**
	 * Mise à jour d'un compte en base de donnée
	 * 
	 * @param Compte
	 */
	public void updateAccount(Compte account) {
		getHibernateTemplate().update(account);
	}
	
	
}
